Revert "gdk: Drop configure events"
authorMatthias Clasen <mclasen@redhat.com>
Sun, 15 Jul 2018 23:52:28 +0000 (19:52 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 16 Jul 2018 00:23:45 +0000 (20:23 -0400)
This reverts commit a8926c9d873ce968353a2eb1d3930c4f1ac79c94.

gdk/gdkevents.c
gdk/gdkevents.h
gdk/gdkeventsprivate.h
gdk/gdksurface.c
gdk/wayland/gdksurface-wayland.c
gdk/x11/gdkdisplay-x11.c
gtk/gtkimcontextxim.c
gtk/gtkmain.c
gtk/gtkwidget.c
gtk/gtkwindow.c
tests/testwindowsize.c

index b53c1469434250f000e9deb326d556a05b675e46..02c61f389a4f6d67b74bc1fef0feca01dd879994 100644 (file)
@@ -817,6 +817,7 @@ gdk_event_get_time (const GdkEvent *event)
         return event->pad_axis.time;
       case GDK_PAD_GROUP_MODE:
         return event->pad_group_mode.time;
+      case GDK_CONFIGURE:
       case GDK_FOCUS_CHANGE:
       case GDK_NOTHING:
       case GDK_DELETE:
@@ -883,6 +884,7 @@ gdk_event_get_state (const GdkEvent  *event,
       case GDK_LEAVE_NOTIFY:
        *state =  event->crossing.state;
         return TRUE;
+      case GDK_CONFIGURE:
       case GDK_FOCUS_CHANGE:
       case GDK_PROXIMITY_IN:
       case GDK_PROXIMITY_OUT:
@@ -931,6 +933,10 @@ gdk_event_get_coords (const GdkEvent *event,
 
   switch ((guint) event->any.type)
     {
+    case GDK_CONFIGURE:
+      x = event->configure.x;
+      y = event->configure.y;
+      break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
       x = event->crossing.x;
@@ -1061,6 +1067,10 @@ gdk_event_set_coords (GdkEvent *event,
 
   switch ((guint) event->any.type)
     {
+    case GDK_CONFIGURE:
+      event->configure.x = x;
+      event->configure.y = y;
+      break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
       event->crossing.x = x;
index d725abf28ccfcc993b12703ae6b44787ce9d2993..291b6d34f85a815d4ac6d0c4e64371ba32eb330a 100644 (file)
@@ -111,6 +111,7 @@ typedef struct _GdkEventScroll      GdkEventScroll;
 typedef struct _GdkEventKey        GdkEventKey;
 typedef struct _GdkEventFocus      GdkEventFocus;
 typedef struct _GdkEventCrossing    GdkEventCrossing;
+typedef struct _GdkEventConfigure   GdkEventConfigure;
 typedef struct _GdkEventProximity   GdkEventProximity;
 typedef struct _GdkEventDND         GdkEventDND;
 typedef struct _GdkEventSetting     GdkEventSetting;
@@ -151,6 +152,8 @@ typedef void (*GdkEventFunc) (GdkEvent *event,
  * @GDK_ENTER_NOTIFY: the pointer has entered the surface.
  * @GDK_LEAVE_NOTIFY: the pointer has left the surface.
  * @GDK_FOCUS_CHANGE: the keyboard focus has entered or left the surface.
+ * @GDK_CONFIGURE: the size, position or stacking order of the surface has changed.
+ *   Note that GTK+ discards these events for %GDK_SURFACE_CHILD surfaces.
  * @GDK_PROXIMITY_IN: an input device has moved into contact with a sensing
  *   surface (e.g. a touchscreen or graphics tablet).
  * @GDK_PROXIMITY_OUT: an input device has moved out of contact with a sensing
@@ -206,6 +209,7 @@ typedef enum
   GDK_ENTER_NOTIFY,
   GDK_LEAVE_NOTIFY,
   GDK_FOCUS_CHANGE,
+  GDK_CONFIGURE,
   GDK_PROXIMITY_IN,
   GDK_PROXIMITY_OUT,
   GDK_DRAG_ENTER,
index 21f3518fbd3d39d1e6ea07b31f890bb198ee3e6e..f4d15507e73f146a4d3b39c4e587b81a4e295e25 100644 (file)
@@ -334,6 +334,26 @@ struct _GdkEventFocus
   gint16 in;
 };
 
+/*
+ * GdkEventConfigure:
+ * @type: the type of the event (%GDK_CONFIGURE).
+ * @surface: the surface which received the event.
+ * @send_event: %TRUE if the event was sent explicitly.
+ * @x: the new x coordinate of the surface, relative to its parent.
+ * @y: the new y coordinate of the surface, relative to its parent.
+ * @width: the new width of the surface.
+ * @height: the new height of the surface.
+ *
+ * Generated when a surface size or position has changed.
+ */
+struct _GdkEventConfigure
+{
+  GdkEventAny any;
+  gint x, y;
+  gint width;
+  gint height;
+};
+
 /*
  * GdkEventProximity:
  * @type: the type of the event (%GDK_PROXIMITY_IN or %GDK_PROXIMITY_OUT).
@@ -563,6 +583,7 @@ struct _GdkEventPadGroupMode {
  * @key: a #GdkEventKey
  * @crossing: a #GdkEventCrossing
  * @focus_change: a #GdkEventFocus
+ * @configure: a #GdkEventConfigure
  * @proximity: a #GdkEventProximity
  * @dnd: a #GdkEventDND
  * @grab_broken: a #GdkEventGrabBroken
@@ -613,6 +634,7 @@ union _GdkEvent
   GdkEventKey              key;
   GdkEventCrossing         crossing;
   GdkEventFocus                    focus_change;
+  GdkEventConfigure        configure;
   GdkEventProximity        proximity;
   GdkEventDND               dnd;
   GdkEventGrabBroken        grab_broken;
index da5d0c65f3ef3d42a6370754ddf4e96006fb17e2..7140f9c2510a545255c201a204a6559cc5303333 100644 (file)
@@ -2639,7 +2639,6 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
 {
   cairo_region_t *old_region, *new_region;
   gboolean expose;
-  gboolean size_changed;
 
   g_return_if_fail (GDK_IS_SURFACE (surface));
 
@@ -2668,7 +2667,6 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
   /* Handle child surfaces */
 
   expose = FALSE;
-  size_changed = FALSE;
   old_region = NULL;
 
   if (gdk_surface_is_viewable (surface) &&
@@ -2694,16 +2692,8 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
     }
   if (!(width < 0 && height < 0))
     {
-      if (surface->width != width)
-        {
-          surface->width = width;
-          size_changed = TRUE;
-        }
-      if (surface->height != height)
-        {
-          surface->height = height;
-          size_changed = TRUE;
-        }
+      surface->width = width;
+      surface->height = height;
     }
 
   recompute_visible_regions (surface, FALSE);
@@ -2726,11 +2716,10 @@ gdk_surface_move_resize_internal (GdkSurface *surface,
       cairo_region_destroy (old_region);
       cairo_region_destroy (new_region);
     }
-
-  if (size_changed)
-    g_signal_emit (surface, signals[SIZE_CHANGED], 0, width, height);
 }
 
+
+
 /**
  * gdk_surface_move:
  * @surface: a #GdkSurface
@@ -3895,6 +3884,7 @@ _gdk_make_event (GdkSurface    *surface,
       break;
 
     case GDK_FOCUS_CHANGE:
+    case GDK_CONFIGURE:
     case GDK_DELETE:
     case GDK_DESTROY:
     default:
index ce0b5d773d8902f1d150dcef217aaa7f5bd7f576..51eca561df1c629514cb1eb304f54d5208030b55 100644 (file)
@@ -698,9 +698,20 @@ gdk_wayland_surface_configure (GdkSurface *surface,
                                int         height,
                                int         scale)
 {
+  GdkDisplay *display;
+  GdkEvent *event;
+
+  event = gdk_event_new (GDK_CONFIGURE);
+  event->any.surface = g_object_ref (surface);
+  event->any.send_event = FALSE;
+  event->configure.width = width;
+  event->configure.height = height;
+
   gdk_wayland_surface_update_size (surface, width, height, scale);
   _gdk_surface_update_size (surface);
-  g_signal_emit_by_name (surface, "size-changed", width, height);
+
+  display = gdk_surface_get_display (surface);
+  _gdk_wayland_display_deliver_event (display, event);
 }
 
 static gboolean
index 72ead44bbb0c1b56fb16167cbe51eb323f95c30f..3dc613fc82dc1b7c8487ff622c9d0f3d757fad4d 100644 (file)
@@ -958,12 +958,11 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
        return_val = FALSE;
       else
        {
-          int x, y, width, height;
+         event->any.type = GDK_CONFIGURE;
+         event->any.surface = surface;
+         event->configure.width = (xevent->xconfigure.width + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
+         event->configure.height = (xevent->xconfigure.height + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
 
-          x = 0;
-          y = 0;
-         width = (xevent->xconfigure.width + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
-         height = (xevent->xconfigure.height + surface_impl->surface_scale - 1) / surface_impl->surface_scale;
          if (!xevent->xconfigure.send_event &&
              !xevent->xconfigure.override_redirect &&
              !GDK_SURFACE_DESTROYED (surface))
@@ -980,34 +979,31 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
                                         &tx, &ty,
                                         &child_window))
                {
-                 x = tx / surface_impl->surface_scale;
-                 y = ty / surface_impl->surface_scale;
+                 event->configure.x = tx / surface_impl->surface_scale;
+                 event->configure.y = ty / surface_impl->surface_scale;
                }
              gdk_x11_display_error_trap_pop_ignored (display);
            }
          else
            {
-             x = xevent->xconfigure.x / surface_impl->surface_scale;
-             y = xevent->xconfigure.y / surface_impl->surface_scale;
+             event->configure.x = xevent->xconfigure.x / surface_impl->surface_scale;
+             event->configure.y = xevent->xconfigure.y / surface_impl->surface_scale;
            }
-
          if (!is_substructure)
            {
-             surface->x = x;
-             surface->y = y;
+             surface->x = event->configure.x;
+             surface->y = event->configure.y;
 
               if (surface_impl->unscaled_width != xevent->xconfigure.width ||
                   surface_impl->unscaled_height != xevent->xconfigure.height)
                 {
                   surface_impl->unscaled_width = xevent->xconfigure.width;
                   surface_impl->unscaled_height = xevent->xconfigure.height;
-                  surface->width = width;
-                  surface->height = height;
+                  surface->width = event->configure.width;
+                  surface->height = event->configure.height;
 
                   _gdk_surface_update_size (surface);
                   _gdk_x11_surface_update_size (surface_impl);
-
-                  g_signal_emit_by_name (surface, "size-changed", width, height);
                 }
 
              if (surface->resize_count >= 1)
@@ -1016,10 +1012,8 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
 
                  if (surface->resize_count == 0)
                    _gdk_x11_moveresize_configure_done (display, surface);
-                }
+               }
            }
-
-          return_val = FALSE;
         }
       break;
 
index 7cdb3c75b7067fc598666acf62ca898d2b36a85b..01629ab05437e5ea208665c94f01d78ffd571b19 100644 (file)
@@ -1603,7 +1603,6 @@ on_status_toplevel_configure (GtkWidget     *toplevel,
                              GdkEvent      *event,
                              StatusWindow  *status_window)
 {
-#if 0
   if (gdk_event_get_event_type (event) == GDK_CONFIGURE)
     {
       GdkRectangle rect;
@@ -1626,7 +1625,6 @@ on_status_toplevel_configure (GtkWidget     *toplevel,
           gtk_window_move (GTK_WINDOW (status_window->window), rect.x, y);
         }
     }
-#endif
 
   return GDK_EVENT_PROPAGATE;
 }
index d92523a90dd1c65204c9bec73f8b4d6fcec16672..5d4b71935e8759b9c9ee681587802962449ad10b 100644 (file)
@@ -1827,6 +1827,17 @@ gtk_main_do_event (GdkEvent *event)
         }
       break;
 
+    case GDK_CONFIGURE:
+      if (GTK_IS_WINDOW (event_widget) &&
+          _gtk_widget_get_surface (event_widget) == event->any.surface)
+        {
+          gtk_window_configure (GTK_WINDOW (event_widget),
+                                event->configure.width,
+                                event->configure.height);
+        }
+
+      break;
+
     case GDK_FOCUS_CHANGE:
     case GDK_GRAB_BROKEN:
       if (!_gtk_widget_captured_event (event_widget, event))
index 514bc0ac4b5ff64dfdff668503988f7fb85b8ed5..a491d5b3e3f1fa0ea8b9744b175194579c21a6c9 100644 (file)
@@ -5270,6 +5270,7 @@ gtk_widget_event_internal (GtkWidget      *widget,
     case GDK_NOTHING:
     case GDK_DELETE:
     case GDK_DESTROY:
+    case GDK_CONFIGURE:
       return gtk_widget_emit_event_signals (widget, event);
     default:
       break;
index 295fbacee12d9a3d4bb9cbdbc5066ca942b497cc..392d4ab268b7bff4e49f024ce7e85eea961da87a 100644 (file)
@@ -6869,7 +6869,6 @@ gtk_window_realize (GtkWidget *widget)
 
   gtk_widget_set_surface (widget, surface);
   g_signal_connect_swapped (surface, "notify::state", G_CALLBACK (surface_state_changed), widget);
-  g_signal_connect_swapped (surface, "size-changed", G_CALLBACK (gtk_window_configure), widget);
   gtk_widget_register_surface (widget, surface);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->realize (widget);
@@ -7008,9 +7007,6 @@ gtk_window_unrealize (GtkWidget *widget)
   g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget),
                                         G_CALLBACK (surface_state_changed),
                                         widget);
-  g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget),
-                                        G_CALLBACK (gtk_window_configure),
-                                        widget);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget);
 
index 0f55a45092c4bd0ffee363fd04ee32636a0408b2..6e62dd0a600d48ceee02c2c780d45aa7e3228ea6 100644 (file)
@@ -8,14 +8,21 @@ static GtkWidget *default_width_spin;
 static GtkWidget *default_height_spin;
 static GtkWidget *resizable_check;
 
-static void
-configure_event_cb (GtkWidget *window, int width, int height, GtkLabel *label)
+static gboolean
+configure_event_cb (GtkWidget *window, GdkEvent *event, GtkLabel *label)
 {
-  gchar *str;
-
-  str = g_strdup_printf ("%d x %d", width, height);
-  gtk_label_set_label (label, str);
-  g_free (str);
+  if (gdk_event_get_event_type (event) == GDK_CONFIGURE)
+    {
+      gchar *str;
+      gint width, height;
+
+      gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+      str = g_strdup_printf ("%d x %d", width, height);
+      gtk_label_set_label (label, str);
+      g_free (str);
+    }
+
+  return GDK_EVENT_PROPAGATE;
 }
 
 static void
@@ -64,8 +71,7 @@ show_dialog (void)
   //gtk_widget_show (label);
 
   gtk_dialog_add_action_widget (GTK_DIALOG (dialog), label, GTK_RESPONSE_HELP);
-  gtk_widget_realize (dialog);
-  g_signal_connect (gtk_widget_get_surface (dialog), "size-changed",
+  g_signal_connect (dialog, "event",
                     G_CALLBACK (configure_event_cb), label);
 
   gtk_dialog_run (GTK_DIALOG (dialog));